#ifndef TAIIC_RKNN_H
#define TAIIC_RKNN_H

#include <stdio.h>
#include <stdlib.h>
#include "unistd.h"
#include "string.h"
#include <dirent.h>
#include <sys/stat.h>
#include "rk_defines.h"
#include "rk_debug.h"
#include "rknn_api.h"

/* self-sufficiency */
#ifdef __cplusplus
extern "C"
{
#endif

#define RKNN_MODEL_PATH "/oem/usr/model/lip.rknn"
// 模型输入大小，NCHW
#define PICTURE_H 320
#define PICTURE_W 320
#define PICTURE_C 49 // 0 +48 ，此处修改为49，语音组采集程序改为50

#define RESIZE_PIC_H 32
#define RESIZE_PIC_W 32

#define MODEL_N 1
#define MODEL_C 4
#define MODEL_H 384
#define MODEL_W 32

#define RESHAPE_H 12
#define RESHAPE_W 1

#define MAX_NUM 1
    // using namespace std;

    typedef struct rkTOOLKIT_CFG_S
    {
        rknn_context context; // 模型上下文
        char *modelPath;      // 模型存放路径
        RK_U8 modelN;         // 模型输入大小

        // Get Model Input Output Info
        rknn_input_output_num io_num; // 模型输入输出信息，结构体

        rknn_tensor_attr input_attrs[1];  // 模型输入属性
        rknn_tensor_attr output_attrs[1]; // 模型输出属性

        rknn_tensor_mem *output_mems[1]; // 模型输出
        rknn_tensor_mem *input_mems[1];  // 模型输入
        rknn_tensor_type input_type;
        rknn_tensor_format input_layout;

        rknn_tensor_attr orig_output_attrs[1]; // 原始输出

    } TOOLKIT_MODEL_CTX_S;

    typedef struct rkRESULTS_LABEL
    {
        /* data */
        RK_U32 label;
        float prob;
        int intprob;

    } MODEL_RESULT_S;

    typedef struct lmRESULTS_LABEL
    {
        /* data */
        int left_x;
        int left_y;
        int right_x;
        int right_y;

    } LM_RESULT_S;

    typedef struct dccrnRESULTS_LABEL
    {
        /* data */
        float *result;
        int sz;

    } DCCRN_RESULT_S;

    // 获取推理后处理，获取模型推理结果
    MODEL_RESULT_S rknn_toolkit_result(TOOLKIT_MODEL_CTX_S *ctx);

    DCCRN_RESULT_S dccrn_rknn_toolkit_result(TOOLKIT_MODEL_CTX_S *ctx);

    // 打印输入输出属性列表
    void dump_tensor_attr(rknn_tensor_attr *attr);

    // 获取sdk及驱动版本
    void get_sdk_driver_version(rknn_context ctx);

    // 配置模型推理相关参数
    int rknn_toolkit_config_init(TOOLKIT_MODEL_CTX_S *ctx);

    // 根据结果自定义ao输出
    // static RK_S32 unit_test_mpi_ao(TEST_AO_CTX_S *ctx, RK_U32 pcm_label);
    // softmax函数
    int rknn_GetTopN(float *pfProb, float *pfMaxProb, uint32_t *pMaxClass, uint32_t outputCount, uint32_t topNum);
    // 量化模型的npu输出结果为int8数据类型，后处理要按照int8数据类型处理
    // 如下提供了int8排布的NC1HWC2转换成float的nchw转换代码
    int NC1HWC2_int8_to_NCHW_float(const int8_t *src, float *dst, int *dims, int channel, int h, int w, int zp, float scale);
    // 量化模型的npu输出结果为int8数据类型，后处理要按照int8数据类型处理
    // 如下提供了int8排布的NC1HWC2转换成int8的nchw转换代码
    int NC1HWC2_int8_to_NCHW_int8(const int8_t *src, int8_t *dst, int *dims, int channel, int h, int w);

    
}

#ifdef __cplusplus

#endif

#endif